﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CardMonitor.Utils
{
 

        public class CardOperationUtil
        {
            // 假设这是与硬件通信的对象
            private readonly CardReader _cardReader;

            public CardOperationUtil(CardReader cardReader)
            {
                _cardReader = cardReader ?? throw new ArgumentNullException(nameof(cardReader));
            }

            /// <summary>
            /// 发卡操作
            /// </summary>
            /// <returns>是否成功</returns>
            public bool IssueCard()
            {
                try
                {
                    // 发送初始化命令
                    if (!SendResetCommand()) return false;

                    // 发送允许出卡口进卡命令
                    if (!SendEnableInletCommand()) return false;

                    // 移动卡片到出卡口
                    if (!MoveCardToOutlet()) return false;

                    return true;
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"发卡失败: {ex.Message}");
                    return false;
                }
            }

            /// <summary>
            /// 写卡操作
            /// </summary>
            /// <param name="data">要写入的数据</param>
            /// <returns>是否成功</returns>
            public bool WriteCard(byte[] data)
            {
                try
                {
                    // 发送初始化命令
                    if (!SendResetCommand()) return false;

                    // 根据文档，这里应该是将卡片移动到相应的写卡位置
                    if (!MoveCardToWritePosition()) return false;

                    // 执行写卡命令
                    if (!ExecuteWriteCommand(data)) return false;

                    return true;
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"写卡失败: {ex.Message}");
                    return false;
                }
            }

            private bool SendResetCommand()
            {
                // 构建复位命令
                var command = new List<byte> { 0xF2, 0x00, 0x00, 0x00, 0x43, 0x30, 0x03 };
                var response = _cardReader.SendCommand(command.ToArray());

                // 解析返回数据
                return IsAcknowledge(response);
            }

            private bool SendEnableInletCommand()
            {
                // 构建允许出卡口进卡命令
                var command = new List<byte> { 0xF2, 0x00, 0x00, 0x00, 0x43, 0x33, 0x30, 0x03 };
                var response = _cardReader.SendCommand(command.ToArray());

                // 解析返回数据
                return IsAcknowledge(response);
            }

            private bool MoveCardToOutlet()
            {
                // 构建移动卡片到出卡口命令
                var command = new List<byte> { 0xF2, 0x00, 0x00, 0x00, 0x43, 0x32, 0x30, 0x03 };
                var response = _cardReader.SendCommand(command.ToArray());

                // 解析返回数据
                return IsAcknowledge(response);
            }

            private bool MoveCardToWritePosition()
            {
                // 根据实际情况调整命令
                var command = new List<byte> { 0xF2, 0x00, 0x00, 0x00, 0x43, 0x32, 0x31, 0x03 };
                var response = _cardReader.SendCommand(command.ToArray());

                // 解析返回数据
                return IsAcknowledge(response);
            }

            private bool ExecuteWriteCommand(byte[] data)
            {
                // 构建写卡命令，具体实现取决于你要写入的内容和格式
                var command = new List<byte> { 0xF2, 0x00, 0x00, 0x00, 0x43, 0x33, 0x30, 0x03 };
                command.AddRange(data);
                var response = _cardReader.SendCommand(command.ToArray());

                // 解析返回数据
                return IsAcknowledge(response);
            }

            private static bool IsAcknowledge(byte[] response)
            {
                // 这里应该根据文档解析返回的数据包，检查是否为ACK
                // 例如：返回包的第一个字节为0xF2且包含ACK (06H)
                return response != null && response.Length > 0 && response[0] == 0xF2 && Array.Exists(response, element => element == 0x06);
            }
        }
    
}
